part of internal;

class Position {
   int _ln;
   int _ch;

   // generator
   Position (int ln, int ch) {
      if (dev) {
         if (ln == null) argErr(ln);
         if (ch == null) argErr(ch);
         if (ln < 0) argErr(ln);
         if (ch < 0) argErr(ch);
      }
      _ln = ln;
      _ch = ch;
      if (dev) if (!valid) staErr(this);
   }

   // mutators
   void set ln (int ln) {
      if (dev) {
         if (ln == null) argErr(ln);
         if (ln < 0) argErr(ln);
      }
      _ln = ln;
      if (dev) if (!valid) staErr(this);
   }
   void set ch (int ch) {
      if (dev) {
         if (ch == null) argErr(ln);
         if (ch < 0) argErr(ln);
      }
      _ch = ch;
      if (dev) if (!valid) staErr(this);
   }

   // observers
   int get ln => _ln;
   int get ch => _ch;

   // invariants
   bool get valid {
      if (_ln == null) return false;
      if (_ch == null) return false;
      if (_ln < 0) return false;
      if (_ch < 0) return false;
      return true;
   }

   // printing
   String toString () => 'ln -> $_ln\nch -> $_ch';
}
